package com.example.qt.ptplatform.mapper;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.qt.ptplatform.entity.Torrent;
import com.example.qt.ptplatform.entity.TorrentMapping;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;


@Mapper
public interface TorrentMapper extends BaseMapper<Torrent> {
    // 重置所有资源的 `is_promo` 字段（置为 0）
    default void resetTorrentPromoStatus() {
        LambdaUpdateWrapper<Torrent> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(Torrent::getIsPromo, 0);
        this.update(null, updateWrapper);  // 这里的 null 代表不传条件，更新所有记录
    }

    // 根据上传时间和 time_range 判断，更新符合条件的资源的 `is_promo` 字段
    @Update("UPDATE torrents SET is_promo = 1 " +
            "WHERE (DATEDIFF(NOW(), upload_time) <= #{timeRange}) " +
            "OR (upload_time BETWEEN #{startTime} AND #{endTime})")
    void updatePromoStatusForEligibleTorrents(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("timeRange") int timeRange);

    //获取种子大小
    @Select("SELECT sizeGB FROM torrents WHERE torrent_id = #{torrentId}")
    Double getTorrentSizeGBById(@Param("torrentId") Integer torrentId);

    // 获取指定时间范围内上传的指定用户的所有种子大小的总和
    @Select("SELECT SUM(sizeGB) FROM torrents WHERE user_id = #{userId} AND upload_time BETWEEN #{startTime} AND #{endTime}")
    Double getTotalUploadSizeByUserIdAndTimeRange(
            @Param("userId") Integer userId,
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime);

    // 根据 qBittorrent 的 hash 获取对应的 torrentId
    @Select("SELECT * FROM torrent_qbittorrent_mapping WHERE qbittorrent_hash = #{qbittorrentHash}")
    TorrentMapping findByQbittorrentHash(String qbittorrentHash);

    // 使用 QueryWrapper 进行模糊查询
    default List<Torrent> findByTitleContaining(String keyword) {
        QueryWrapper<Torrent> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("title", keyword); // 根据 title 字段进行模糊查询
        return selectList(queryWrapper);
    }

    // 使用 QueryWrapper 进行模糊查询
    default List<Torrent> findByDescriptionContaining(String keyword) {
        QueryWrapper<Torrent> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("description", keyword); // 根据 description 字段进行模糊查询
        return selectList(queryWrapper);
    }

    // 根据 tags 字段模糊查询
    default List<Torrent> findByTagsContaining(String keyword) {
        QueryWrapper<Torrent> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("tags", keyword);  // 在 tags 字段上进行模糊查询
        return selectList(queryWrapper);
    }

    // 根据用户ID获取该用户上传的所有种子文件
    @Select("SELECT * FROM torrents WHERE user_id = #{userId}")
    List<Torrent> getTorrentsByUserId(Integer userId);

}
